home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-05-01 | 8.3 KB | 221 lines | [TEXT/MPS ] |
- /*
- File: MixedMode.idl
-
- Contains: Mixed Mode Manager Interfaces.
-
- Version: Technology: System 7.5
- Release: Universal Interfaces 3.0d3 on Copland DR1
-
- Copyright: © 1984-1996 by Apple Computer, Inc. All rights reserved.
-
- Bugs?: If you find a problem with this file, send the file and version
- information (from above) and the problem description to:
-
- Internet: apple.bugs@applelink.apple.com
- AppleLink: APPLE.BUGS
-
- */
- #ifndef __MIXEDMODE_IDL__
- #define __MIXEDMODE_IDL__
-
- #include <somobj.idl>
- #include <somcls.idl>
-
- #ifndef __TYPES_IDL__
- #include <Types.idl>
- #endif
-
- #ifdef __SOMIDL__
-
- #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
- /* Mixed Mode constants */
- /* Current Routine Descriptor Version */
- /* MixedModeMagic Magic Cookie/Trap number */
- /* Calling Conventions */
- typedef unsigned short CallingConventionType;
-
- /* ISA Types */
- typedef SInt8 ISAType;
-
- /* RTA Types */
- typedef SInt8 RTAType;
-
- /* Constants for specifing 68k registers */
- typedef unsigned short registerSelectorType;
-
- /* SizeCodes we use everywhere */
- /* Mixed Mode Routine Records */
- typedef unsigned long ProcInfoType;
-
- /* Routine Flag Bits */
- typedef unsigned short RoutineFlagsType;
-
- #endif
- #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
- typedef SOMLargeStruct RoutineRecord; /* Derived from a struct of 20 bytes in size */
-
- typedef OpaquePtr RoutineRecordPtr; /* Substituted OpaquePtr for “RoutineRecord*” */
-
- typedef OpaquePtr RoutineRecordHandle; /* Substituted OpaquePtr for “RoutineRecordPtr*” */
-
- /* Mixed Mode Routine Descriptors */
- /* Definitions of the Routine Descriptor Flag Bits */
- typedef UInt8 RDFlagsType;
-
- /* Routine Descriptor Structure */
- typedef SOMLargeStruct RoutineDescriptor; /* Derived from a struct of 32 bytes in size */
-
- typedef OpaquePtr RoutineDescriptorPtr; /* Substituted OpaquePtr for “RoutineDescriptor*” */
-
- typedef OpaquePtr RoutineDescriptorHandle; /* Substituted OpaquePtr for “RoutineDescriptorPtr*” */
-
- #endif
- #if FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED
- #endif
- #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
- /* Mixed Mode ProcInfos */
- #endif
- #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
- /*
- NOTES ON USING ROUTINE DESCRIPTOR FUNCTIONS
-
- When calling these routine from classic 68k code there are two possible intentions.
-
- The first is source compatibility with code ported to CFM (either PowerPC or 68k CFM). When
- the code is compiled for CFM the functions create routine descriptors that can be used by
- the mixed mode manager operating on that machine. When the code is compiled for classic 68k
- these functions do nothing so that the code will run on Macintoshes that do not have a
- mixed mode manager. The dual nature of these functions is achieved by turning the CFM calls
- into "no-op" macros for classic 68k: You can put "NewRoutineDescriptor" in your source,
- compile it for any runtime or instruction set architecture, and it will run correctly on the
- intended runtime/instruction platform. All without source changes and/or conditional source.
-
- The other intention is for code that "knows" that it is executing as classic 68k runtime
- and is specifically trying to call code of another architecture using mixed mode. Since the
- routines were designed with classic <-> CFM source compatibility in mind this second case
- is treated special. For classic 68k code to create routines descriptors for use by mixed mode
- it must call the "Trap" versions of the routines (NewRoutineDescriptorTrap). These versions
- are only available to classic 68k callers: rigging the interfaces to allow calling them
- from CFM code will result in runtime failure because no shared library implements or exports
- the functions.
-
-
- This almost appears seamless until you consider "fat" routine descriptors and the advent of
- CFM-68K. What does "fat" mean? CFM-68K is not emulated on PowerPC and PowerPC is not emulated
- on CFM-68K. It makes no sense to create a routine descriptor having both a CFM-68K routine
- and a PowerPC native routine pointer. Therefore "fat" is defined to be a mix of classic and
- CFM for the hardware's native instruction set: on PowerPC fat is classic and PowerPC native,
- on a 68k machine with CFM-68K installed fat is classic and CFM-68K.
-
- By definition fat routine descriptors are only constructed by code that is aware of the
- architecture it is executing as and that another architecture exists. Source compatibility
- between code intented as pure classic and pure CFM is not an issue and so NewFatRoutineDescriptor
- is not available when building pure classic code.
-
- NewFatRoutineDescriptorTrap is available to classic code on both PowerPC and CFM-68K. The
- classic code can use the code fragment manager routine "FindSymbol" to obtain the address of
- a routine in a shared library and then construct a routine descriptor with both the CFM routine
- and classic routine.
- */
- #if GENERATINGCFM
- #else
- /* Note that the call to NewFatRoutineDescriptor is undefined when GENERATINGCFM is false. */
- #endif
- #if GENERATINGCFM
- /*
- CallUniversalProc is only implemented in shared libraries on 68k and PowerPC, it is now
- conditionalize with GENERATINGCFM. This will catch accidental calls from classic 68K code
- that previously only showed up as linker errors.
- */
- #endif
- #endif
- /* Macros for building ProcInfos */
- /*
- * * * * * * * * * * * * * *
- * SIZE_CODE - Return the size code for an object, given its size in bytes.
- * size - size of an object in bytes
- */
- /*
- * * * * * * * * * * * * * *
- * RESULT_SIZE - Return the result field of a ProcInfo, given the return object’s size.
- * This is the same for all ProcInfos
- * sizeCode - size code
- */
- /*
- * * * * * * * * * * * * * *
- * STACK_ROUTINE_PARAMETER - Return a parameter field of a ProcInfo, for a simple,
- * non-dispatched, stack based routine.
- * whichParam - which parameter
- * sizeCode - size code
- */
- /*
- * * * * * * * * * * * * * *
- * DISPATCHED_STACK_ROUTINE_PARAMETER - Return a parameter field of a ProcInfo, for
- * a dispatched, stack based routine. The same
- * macro is used regardless of the type of
- * dispatching.
- * whichParam - which parameter
- * sizeCode - size code
- */
- /*
- * * * * * * * * * * * * * *
- * DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE - Return a the selector size field of a ProcInfo
- * for a dispatched, stack based routine. The
- * same macro is used regardless of the type of
- * dispatching.
- * sizeCode - size code
- */
- /*
- * * * * * * * * * * * * * *
- * REGISTER_RESULT_LOCATION - Return the Result Location field of a ProcInfo,
- * given the location.
- * whichReg - which register
- */
- /*
- * * * * * * * * * * * * * *
- * REGISTER_ROUTINE_PARAMETER - Return a parameter field of a ProcInfo for a
- * register based routine.
- */
- /*
- * * * * * * * * * * * * * *
- *
- * SPECIAL_CASE_PROCINFO - Returns the procInfo constant for the following special cases:
- *
- * High Hook & Caret Hook - (see I-379)
- * C calling conventions, Rect on stack, pointer in A3, no return value
- * EOL Hook - (see VI-15-26)
- * Register-based; inputs in D0, A3, A4;
- * output is Z flag of status register
- * Width Hook - (see VI-15-27)
- * Register-based; inputs in D0, D1, A0, A3, A4; output in D1
- * NWidth Hook - (see VI-15-27)
- * Register-based; inputs in D0, D1, D2, A0, A2, A3, A4; output in D1
- * TextWidthHook - (see VI-15-28)
- * Register-based; inputs in D0, D1, A0, A3, A4; output in D1
- * DrawHook - (see VI-15-28)
- * Register-based; inputs in D0, D1, A0, A3, A4; no output
- * HitTestHook - (See VI-15-29)
- * Register-based; inputs in D0, D1, D2, A0, A3, A4; outputs in D0, D1, D2
- * FindWord - (see VI-15-30)
- * Register-based; inputs in D0, D2, A3, A4; outputs in D0, D1
- * ADBRoutines - (see V-371)
- * Register-based; inputs in A0, A1, A2, D0; no outputs
- * ProtocolHandler - (see II-326)
- * Register-based; inputs in A0, A1, A2, A3, A4, D1.w; output in Z
- * SocketListener - (see II-329)
- * Register-based; inputs in A0, A1, A2, A3, A4, D0.b, D1.w; output in Z
- * Reclac - (see I-391)
- * Register-based; inputs in A3, D7; outputs in D2, D3, D4
- * DoText - (see I-391)
- * Register-based; inputs in A3, D3, D4, D7; outputs in A0, D0
- * GNEFilterProc - (see tech note 85)
- * Register & Stack Based; inputs in A1, D0 & on the stack; outputs on the stack
- * MenuBarHook - (see I-356)
- * Register & Stack Based; input on the stack; output in D0
- */
-
- #endif /* __SOMIDL__ */
-
- #endif /* __MIXEDMODE_IDL__ */
-
-